package com.ingenio.dao;

import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.PrecioProducto;
import com.ingenio.business.Producto;
import com.ingenio.business.UMProducto;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class PrecioProductoAdapter extends Adapter{
	
	public void agregarPrecioProdcuto(PrecioProducto pp) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
	    	conn = (Connection) abrirConexion();
	    	String add ="INSERT precioproducto (IdProducto, IdUmStock, fechaDesde, precio) " +
					"VALUES (?, ?, ?, ?,)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			stmt.setString(1, pp.getProducto().getIdProducto());
			stmt.setInt(2, pp.getUmVenta().getUnidadMedida().getIdUnidadMedida());
			stmt.setTimestamp(3, new Timestamp(pp.getFechadesde().getTime()));
			stmt.setDouble(4, pp.getPrecio());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public boolean agregarPreciosProdcuto(List<PrecioProducto> precios, Connection conn) throws Exception{
		PreparedStatement stmt = null;
		try {
	    	String add ="INSERT precioproducto (IdProducto, IdUmStock, fechaDesde, precio) " +
					"VALUES (?,?,?,?)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			for(PrecioProducto pp : precios){
				stmt.setString(1, pp.getProducto().getIdProducto());
				stmt.setInt(2, pp.getUmVenta().getUnidadMedida().getIdUnidadMedida());
				stmt.setTimestamp(3, new Timestamp(pp.getFechadesde().getTime()));
				stmt.setDouble(4, pp.getPrecio());
//				stmt.execute();
				stmt.addBatch();
			}
			stmt.executeBatch();
		}
    	catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public PrecioProducto devolverPrecioProducto(Producto p, UMProducto ump) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	PrecioProducto pp = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT * " +
    					"FROM precioproducto " +
    					"WHERE IdProducto = ? " +
    						"and IdUmStock = ? " +
    						"and fechaDesde <= now() " +
    					"ORDER BY fechaDesde DESC " +
    					"LIMIT 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setString(1, p.getIdProducto());
    		stmt.setInt(2, ump.getUnidadMedida().getIdUnidadMedida());
    		ResultSet result = stmt.executeQuery();
    		if(result.next()){
    			Date fechaDesde = result.getTimestamp("fechaDesde");
    			Double precio = result.getDouble("precio");
    			pp = new PrecioProducto(p, fechaDesde, precio, ump);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
		return pp;
    }
	
	public List<PrecioProducto> devolverPreciosProducto(Producto p) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	PrecioProducto pp = null;
    	List<PrecioProducto> precios = new ArrayList<PrecioProducto>();
    	UMProductoAdapter umpa = new UMProductoAdapter();
    	UMProducto ump = null;
    	Integer idUM = null;
    	Date fechaDesde = null;
		Double precio=null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT * " +
    					"FROM precioproducto " +
    					"WHERE IdProducto = ? " +
    					"ORDER BY fechaDesde DESC ";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setString(1, p.getIdProducto());
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			fechaDesde = result.getTimestamp("fechaDesde");
    			precio = result.getDouble("precio");
    			idUM = result.getInt("IdUMStock");
    			ump = umpa.devolverUMProducto(p.getIdProducto(), idUM);
    			pp = new PrecioProducto(p, fechaDesde, precio, ump);
    			precios.add(pp);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
		return precios;
    }

}
